// 导入验证模块Express-validator，在每个User上加数组，对body相关数据进行校验
const { body, param} = require('express-validator')
const validate = require('../middleware/validator')
const { Article } = require('../model')

// 创建文章的校验
exports.createArticle = validate([
        body('article.title').notEmpty().withMessage('文章标题不能为空'),
        body('article.description').notEmpty().withMessage('文章摘要不能为空'),
        body('article.body').notEmpty().withMessage('文章内容不能为空'),
    ])

// 获取文章的校验规则
// 获取param数据，对articleId进行验证，如果URL中传入的articleId不存在，不应该报500错误，而应该报400
// 注释掉的是原本的做法，现改为调用如“更新文章的校验规则”一样的封装
exports.getArticle = validate([
    validate.isValidObjectId(['params'],'articleId')
    // param('articleId').custom(async value => {
    //     // 返回一个失败状态的promise
    //     if (!mongoose.isValidObjectId(value)) {
    //         return Promise.reject('文章ID类型错误')
    //     }
    // })
])

// 更新文章的校验规则
exports.updateArticle = [
    // 校验传入进来的文章id是否合规
    validate([
        // 第一个参数是验证的位置，第二个参数是要验证的字段
        validate.isValidObjectId(['params'],'articleId')
    ]),
    // 校验文章是否存在
    async (req,res,next) => {
        const articleId = req.params.articleId
        const article = await Article.findById(articleId)
        req.article = article
        if (!article) {
            return res.status(404).end()
        }
        next()
    },
    // 修改的文章作者是否是当前的登录用户
    async (req,res,next)=> {
        if (req.user._id.toString() !== req.article.author.toString()) {
            return res.status(403).end()
        }
        next()
    }
]

// 删除文章的校验规则
// 与更新文章相同
exports.deleteArticle = exports.updateArticle
